package ubo.master1.jeupoker.ia;

import ubo.master1.jeupoker.gui.LaCart;
import java.util.Collection;

/**
 * Génére des carte pour une main.
 * 
 * Les cartes sont ordiner par ordre décriossant.
 */
public class UneMain {
    
    /** La nombre maximum de carte dans une main. */
    private static final int MAX_NO_OF_CARDS = 7;
    
    /** Les cartes de la main. */
    private LaCart[] cards = new LaCart[MAX_NO_OF_CARDS];
    
    /** Le numéro de la carte courante. */
    private int noOfCards = 0;
    
    /**
     * Constructeur d'une main.
     */
    public UneMain() {
        // Empty implementation.
    }
    
    /**
     * Constructeur avec des carte en paramettre.
     * 
     * @param cards
     *            Les carte initials.
     * 
     * @throws IllegalArgumentException
     *             Si le tableau est null ou nombre de carte invalide.
     */
    public UneMain(LaCart[] cards) {
        addCards(cards);
    }
    
    /**
     * Constructeur avec des carte initial.
     * 
     * @param cards
     *            Les cartes initials.
     */
    public UneMain(Collection<LaCart> cards) {
        if (cards == null) {
            throw new IllegalArgumentException("Null array");
        }
        for (LaCart card : cards) {
            addCard(card);
        }
    }
    
    /**
     * Constructeur String représentant les cartes inictials.
     * 
     * Le String doit contenue une ou plusieur description de carte .
     * Une carte doit être reprensenté par le numéro puis la couleur de la carte.
     * The cards must be separated by a space character.
     * 
     * Exemple: "Kh 7d 4c As Js"
     * 
     * @param s
     *            Le string a parser.
     * 
     * @return La main.
     * 
     * @throws IllegalArgumentException
     *             Si le string ne peu pas être parsé ou le nombre de carte 
     * est trôt grand.
     */
    public UneMain(String s) {
        if (s == null || s.length() == 0) {
            throw new IllegalArgumentException("Null or empty string");
        }
        
        String[] parts = s.split("\\s");
        if (parts.length > MAX_NO_OF_CARDS) {
            throw new IllegalArgumentException("Too many cards in hand");
        }
        for (String part : parts) {
            addCard(new LaCart(part));
        }
    }
    
    /**
     * Returner le nombre de carte dans la main.
     * 
     * @return le nombre de cartes.
     */
    public int size() {
        return noOfCards;
    }
    
    /**
     * Ajout d'une carte.
     * 
     * La carte est inseré à la position corepondante dans lordre décroissant
     * 
     * @param card
     *            La carte à ajouter.
     * 
     * @throws IllegalArgumentException
     *             Si la carte est null.
     */
    public void addCard(LaCart card) {
        if (card == null) {
            throw new IllegalArgumentException("Null card");
        }
        
        int insertIndex = -1;
        for (int i = 0; i < noOfCards; i++) {
            if (card.compareTo(cards[i]) > 0) {
                insertIndex = i;
                break;
            }
        }
        if (insertIndex == -1) {
            // Could not insert anywhere, so append at the end.
            cards[noOfCards++] = card;
        } else {
            for (int i = noOfCards; i > insertIndex; i--) {
                cards[i] = cards[i - 1];
            }
            cards[insertIndex] = card;
            noOfCards++;
        }
    }
    
    /**
     * Ajout de plusieurs cartes.
     * 
     * Les carte sont inséré dans l'ordre décroissant.
     * 
     * @param cards
     *            Les cartes.
     */
    public void addCards(LaCart[] cards) {
        if (cards == null) {
            throw new IllegalArgumentException("Null array");
        }
        if (cards.length > MAX_NO_OF_CARDS) {
            throw new IllegalArgumentException("Too many cards");
        }
        for (LaCart card : cards) {
            addCard(card);
        }
    }
    
    /**
     * Ajout de plusieur cartes.
     * 
     * Les carte sont inséré dans l'ordre décroissant
     * (les carte ayant le numéro supérieur au premier )
     * 
     * @param cards
     *           Les carte à ajouter .
     */
    public void addCards(Collection<LaCart> cards) {
        if (cards == null) {
            throw new IllegalArgumentException("Null collection");
        }
        if (cards.size() > MAX_NO_OF_CARDS) {
            throw new IllegalArgumentException("Too many cards");
        }
        for (LaCart card : cards) {
            addCard(card);
        }
    }
    
    /**
     * Retourner les carte.
     *
     * @return Les cartes.
     */
    public LaCart[] getCards() {
        LaCart[] dest = new LaCart[noOfCards];
        System.arraycopy(cards, 0, dest, 0, noOfCards);
        return dest;
    }
    
    /**
     * Supprimer toutes les cartes.
     */
    public void removeAllCards() {
        noOfCards = 0;
    }
    
    /**
     * Retourner un string representant l'objet.
     *
     * @return  String represantant la description de l'objet
     */
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < noOfCards; i++) {
            sb.append(cards[i]);
            if (i < (noOfCards - 1)) {
                sb.append(' ');
            }
        }
        return sb.toString();
    }
    
}
